package _剑指offer.二叉树;

import util.TreeNode;
import org.junit.Test;

/**
 * 对称二叉树定义： 对于树中 任意两个对称节点 LL 和 RR ，一定有：
 * L.val = R.valL.val=R.val ：即此两对称节点值相等。
 * L.left.val = R.right.valL.left.val=R.right.val ：即 LL 的 左子节点 和 RR 的 右子节点 对称；
 * L.right.val = R.left.valL.right.val=R.left.val ：即 LL 的 右子节点 和 RR 的 左子节点 对称。
 */
public class _28_对称的二叉树 {
    @Test
    public void main() {
        Integer[] input = new Integer[]{1, 2, 2, 3, 4, 4, 3};
        TreeNode root = TreeNode.getTreeFromArray(input);
        System.out.println("isSymmetric(root) = " + isSymmetric(root));
    }
    
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return recur(root.left, root.right);
    }
    
    private boolean recur(TreeNode left, TreeNode right) {
        if (left == null && right == null) return true;
        if (left == null || right == null || left.val != right.val) return false;
        return recur(left.left, right.right);
    }
}
